/**
 * 尝试获取浏览器支持的语音识别 API，优先使用标准 API，若不支持则使用 WebKit 内核的 API
 */
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
/**
 * 处于语音识别状态下的提示语
 */
const VOICE_RECOGNITION_TIP = "月华正在聆听哦...";
// 检查浏览器是否支持语音识别
if (!SpeechRecognition) {
	// 若不支持，显示错误提示信息
	showSystemMessage("您的浏览器不支持语音识别！", 'error');
	// 若语音输入按钮存在，则禁用该按钮
	if (voiceInputButton) voiceInputButton.disabled = true;
}
else {
	/**
	 * 创建语音识别实例
	 */
	const recognition = new SpeechRecognition();
	// 设置语音识别语言为中文（中国大陆）
	recognition.lang = 'zh-CN';
	// 启用实时识别结果，即识别过程中也能获取中间结果
	recognition.interimResults = true;
	// 设置连续识别，即不结束识别会话
	recognition.continuous = false;
	// 添加识别状态变量
	let isRecognizing = false;
	// 为语音输入按钮添加点击事件监听器
	voiceInputButton.addEventListener('click',
		() => {
			console.log("点击了语音输入按钮", isRecognizing, !SpeechRecognition);
			// 若当前正在进行语音识别，则停止识别并重置相关状态
			if (isRecognizing) {
				// 停止语音识别
				recognition.stop();
				// 更新识别状态为未识别
				isRecognizing = false;
				// 恢复按钮的提示文本为 "语音输入"
				voiceInputButton.title = "语音输入";
				// 取消语音输入按钮的激活状态
				voiceInputButton.classList.remove("activate");
				// 获取按钮中的图标元素
				const icon = voiceInputButton.querySelector('i');
				// 若图标元素存在，则将其类名恢复为表示麦克风的图标类名
				if (icon) icon.className = "fas fa-microphone";
			}
			// 若当前未进行语音识别，则开始识别并更新相关状态
			else {
				console.log("开始识别");
				// 启动语音识别
				recognition.start();
				// 停止语音模型
				stopSpeechModel();
				// 更新识别状态为正在识别
				isRecognizing = true;
				console.log("点击了语音输入按钮", isRecognizing, !SpeechRecognition);
				// 修改按钮的提示文本为 "停止识别"
				voiceInputButton.title = "停止识别";
				// 启用语音输入按钮的激活状态
				voiceInputButton.classList.add("activate");
				// 获取按钮中的图标元素
				const icon = voiceInputButton.querySelector('i');
				// 若图标元素存在，则将其类名修改为表示暂停的图标类名
				if (icon) icon.className = "fas fa-pause-circle";
				// 更新输入框状态，提示用户正在聆听
				live2dInputBox.value = VOICE_RECOGNITION_TIP;
				chatInputBox.value = VOICE_RECOGNITION_TIP;
			}
		}
	);
	// 当语音识别有结果时触发此事件
	recognition.onresult = (event) => {
		/**
		 * 用于存储识别结果的字符串
		 */
		let transcript = '';
		// 遍历所有识别结果
		for (let i = event.resultIndex; i < event.results.length; i++) {
			// 若为最终结果，将其追加到 transcript 中
			if (event.results[i].isFinal) transcript += event.results[i][0].transcript;
			// 若为中间结果，直接更新 transcript
			else transcript = event.results[i][0].transcript;
		}
		// 若 live2d 输入框存在，将识别结果填充到该输入框中
		if (window.live2dInputBox) live2dInputBox.value = transcript;
		// 若聊天输入框存在，将识别结果填充到该输入框中
		if (window.chatInputBox) chatInputBox.value = transcript;
	};
	// 当语音识别出错时触发此事件
	recognition.onerror = () => {
		// 显示错误信息，包含错误类型
		showSystemMessage('月华... 听不到阁下的发言', 'error');
		// 重置识别状态
		isRecognizing = false;
		// 恢复按钮状态
		if (voiceInputButton) {
			voiceInputButton.title = "语音输入";
			// 取消语音输入按钮的激活状态
			voiceInputButton.classList.remove("activate");
			// 获取按钮中的图标元素
			const icon = voiceInputButton.querySelector('i');
			if (icon) icon.className = "fas fa-microphone";
		}
	};
	// 当语音识别结束时触发此事件
	recognition.onend = () => {
		console.log("语音识别结束");
		// 若 live2d 输入面板显示，则清空聊天输入框
		if (getComputedStyle(live2dInputPanel).display !== 'none') chatInputBox.value = "";
		// 若 live2d 输入面板隐藏，则清空 live2d 输入框
		else live2dInputBox.value = "";
		// 检查输入框的值是否为语音识别状态下的提示语，若任一输入框为提示语
		if (chatInputBox.value === VOICE_RECOGNITION_TIP || live2dInputBox.value === VOICE_RECOGNITION_TIP) {
			// 清空 live2d 输入框
			live2dInputBox.value = "";
			// 清空聊天输入框
			chatInputBox.value = "";
			// 提前返回，结束当前函数逻辑
			return;
		}
		// 若语音识别未被禁用，则延迟后调用发送聊天消息到后端模型的函数
		if (!isDisableVoiceRecognition) setTimeout(() => sendChatMessageToBackendModel(), 500);
		// 重置识别状态
		isRecognizing = false;
		// 恢复按钮状态
		if (voiceInputButton) {
			// 恢复按钮的提示文本为 "语音输入"
			voiceInputButton.title = "语音输入";
			// 取消语音输入按钮的激活状态
			voiceInputButton.classList.remove("activate");
			// 获取按钮中的图标元素
			const icon = voiceInputButton.querySelector('i');
			// 若图标元素存在，则将其类名恢复为表示麦克风的图标类名
			if (icon) icon.className = "fas fa-microphone";
		}
	};
}